class_name StorageSystem
extends BaseSystem

## 游戏存储系统，用于持久化存储
## 一般是转成Json存到游戏目录下，也可能是转成Resource存储
#region 属性
const save_data_file_path = "user://save_data"
const save_data_file_name = "save_data.tres"
var save_data:SaveData
#endregion
#region 字段
#endregion
#region 信号
signal start_save
signal end_save
signal start_load
signal end_load
#endregion

#region 基类方法
func init_system(args = null):
	super(args)
	load_all()
#endregion
#region 公共方法
func get_save_data():
	return save_data
func save_to_res():
	if not save_data:
		save_data = SaveData.new()
	if not DirAccess.open(save_data_file_path):
		DirAccess.make_dir_absolute(save_data_file_path)
	var err = ResourceSaver.save(save_data,save_data_file_path + "/" + save_data_file_name)
	if err == OK:
		print("SaveData保存成功")
	else:
		print("SaveData保存失败：" + str(err))
func load_from_res():
	var existed = FileAccess.file_exists(save_data_file_path + "/" + save_data_file_name)
	if not existed:
		print("SaveData不存在")
		save_data = SaveData.new()
		return
	save_data = ResourceLoader.load(save_data_file_path + "/" + save_data_file_name,"SaveData")
	if save_data:
		print("SaveData加载成功")
	else:
		print("SaveData加载失败")
		save_data = SaveData.new()
func save_all():
	start_save.emit()
	save_audio()
	save_to_res()
	end_save.emit()
## TODO 加载save_data 同时初始化所有与存档相关的系统等
func load_all():
	start_load.emit()
	load_from_res()
	load_audio()
	end_load.emit()
func restore_save_data():
	save_data.restore()
# TODO 实现一些具体的信息存储方法，例如杀敌数
#region Audio
func save_audio():
	if not save_data:
		return
	save_data.audio = {
		BGM = GameAudioSystem.bgm_vol_db,
		SFX = GameAudioSystem.sfx_vol_db,
	}
func load_audio():
	GameAudioSystem.set_bgm_vol(save_data.audio.BGM)
	GameAudioSystem.set_sfx_vol(save_data.audio.SFX)
#endregion
#endregion
#region 私有方法
#endregion
#region 生命周期函数
func _notification(what: int) -> void:
	if what == NOTIFICATION_WM_CLOSE_REQUEST:
		save_all()
#endregion
